#import resturant csv to my computer

data1 <- read.csv("/Users/lin/Desktop/Restaurant.csv")
head(data1)
class(data1$cuisines)
[1] "factor"
a <- as.character(data1$cuisines) 

#I am trying to identity which resturant is vegetarian

library("stringr")
vege <- str_detect(a,"Vegetarian")
data2 <- cbind(vege,data1)

#Filter out the restaurant which is not vegetarian

class(data2$vege)
[1] "logical"
data2$vege <- as.numeric(data2$vege)

#do the subset for vege

library(dplyr)

Attaching package: ‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
data3 <- subset(data2,vege==1) 

create a new dataset that I convert to lat and lon to the county level

library(dplyr)
data4 <- data3 %>% 
  select(id,city,name,latitude, longitude,phones,paymentTypes,postalCode) %>% 
  na.omit()
View(data4)
library(sp)
library(maps)
library(maptools)
Checking rgeos availability: TRUE
# The single argument to this function, pointsDF, is a data.frame in which:
#   - column 1 contains the longitude in degrees (negative in the US)
#   - column 2 contains the latitude in degrees

latlong2county <- function(pointsDF) {
    # Prepare SpatialPolygons object with one SpatialPolygon
    # per county
    counties <- map('county', fill=TRUE, col="transparent", plot=FALSE)
    IDs <- sapply(strsplit(counties$names, ":"), function(x) x[1])
    counties_sp <- map2SpatialPolygons(counties, IDs=IDs,
                     proj4string=CRS("+proj=longlat +datum=WGS84"))

    # Convert pointsDF to a SpatialPoints object 
    pointsSP <- SpatialPoints(pointsDF, 
                    proj4string=CRS("+proj=longlat +datum=WGS84"))

    # Use 'over' to get _indices_ of the Polygons object containing each point 
    indices <- over(pointsSP, counties_sp)

    # Return the county names of the Polygons object containing each point
    countyNames <- sapply(counties_sp@polygons, function(x) x@ID)
    countyNames[indices]
}

# Test the function using points in Wisconsin and Oregon.
testPoints <- data.frame(x = data4$longitude, y = data4$latitude)

county_list<- latlong2county(testPoints)
county_list_data <- as.data.frame(county_list)
data5 <- cbind(data4,county_list_data) #merge to data4 by adding a column named county_list
data5 <- data5 %>% 
  na.omit()
unique(data5$county_list)
 [1] new york,chautauqua  new york,albany      new york,saratoga   
 [4] new york,rensselaer  new york,washington  new york,ulster     
 [7] new york,warren      new york,westchester new york,kings      
[10] new york,queens      new york,new york    new york,cayuga     
[13] new york,bronx       new york,dutchess    new york,nassau     
[16] new york,ontario     new york,erie        new york,suffolk    
[19] new york,onondaga    new york,columbia    new york,franklin   
[22] new york,monroe      new york,orange      new york,oneida     
[25] new york,essex       new york,otsego      new york,greene     
[28] new york,putnam      new york,niagara     new york,delaware   
[31] new york,rockland    new york,clinton     new york,montgomery 
[34] new york,broome      new york,tompkins    new york,seneca     
[37] new york,sullivan    new york,madison     new york,st lawrence
[40] new york,steuben     new york,chemung     new york,herkimer   
[43] new york,chenango    new york,schenectady new york,hamilton   
[46] new york,livingston  new york,jefferson   new york,tioga      
[49] new york,cortland    new york,yates       new york,fulton     
[52] new york,wayne       new york,schuyler    new york,orleans    
[55] new york,cattaraugus new york,genesee     new york,lewis      
[58] new york,oswego     
58 Levels: new york,albany new york,bronx ... new york,yates

#regular expression for ny vege restaurant data

county_name <- as.character(data5$county_list)
# Remove all before and up to ",":
county_name2 <- gsub(".*,","",county_name)
data6 <- cbind(county_name2,data5)  
data6$county_list <- NULL
data6
unique(data6$county_name2)
 [1] chautauqua  albany      saratoga    rensselaer  washington  ulster     
 [7] warren      westchester kings       queens      new york    cayuga     
[13] bronx       dutchess    nassau      ontario     erie        suffolk    
[19] onondaga    columbia    franklin    monroe      orange      oneida     
[25] essex       otsego      greene      putnam      niagara     delaware   
[31] rockland    clinton     montgomery  broome      tompkins    seneca     
[37] sullivan    madison     st lawrence steuben     chemung     herkimer   
[43] chenango    schenectady hamilton    livingston  jefferson   tioga      
[49] cortland    yates       fulton      wayne       schuyler    orleans    
[55] cattaraugus genesee     lewis       oswego     
58 Levels: albany bronx broome cattaraugus cayuga chautauqua ... yates

#import election data

eleccounty<-read.csv("/Users/lin/Desktop/2016_US_County_Level_Presidential_Results.csv")

eleccounty$X1 <- NULL

eleccounty <- eleccounty %>% 
         filter(state_abbr=="NY") #there are 62 counties in NY State

#do some regular expression on election data

foo <- as.character(eleccounty$county_name)
foo2 <- gsub("\\s*\\w*$", "", foo)
foo3 <- tolower(foo2)
foo4 <- str_replace(foo3, "st. lawrence", "st lawrence")
foo4
 [1] "albany"      "allegany"    "bronx"       "broome"      "cattaraugus"
 [6] "cayuga"      "chautauqua"  "chemung"     "chenango"    "clinton"    
[11] "columbia"    "cortland"    "delaware"    "dutchess"    "erie"       
[16] "essex"       "franklin"    "fulton"      "genesee"     "greene"     
[21] "hamilton"    "herkimer"    "jefferson"   "kings"       "lewis"      
[26] "livingston"  "madison"     "monroe"      "montgomery"  "nassau"     
[31] "new york"    "niagara"     "oneida"      "onondaga"    "ontario"    
[36] "orange"      "orleans"     "oswego"      "otsego"      "putnam"     
[41] "queens"      "rensselaer"  "richmond"    "rockland"    "saratoga"   
[46] "schenectady" "schoharie"   "schuyler"    "seneca"      "st lawrence"
[51] "steuben"     "suffolk"     "sullivan"    "tioga"       "tompkins"   
[56] "ulster"      "warren"      "washington"  "wayne"       "westchester"
[61] "wyoming"     "yates"      

#regular expression of final step for election data

new_eleccounty <- cbind(eleccounty,foo4)

names(new_eleccounty)[names(new_eleccounty) == 'foo4'] <- 'county_name2'

#calculate who is win in 2016 on the county level

new_eleccounty <- new_eleccounty %>% 
  mutate(difference_in_vote=votes_gop-votes_dem) %>% 
  mutate (R.D= ifelse(difference_in_vote > 0, "Republican", "Democrat"))

#combine cleaned ny vege reastaurant with election county data in 2016

#left outer join
df <- left_join(data6, new_eleccounty,by = "county_name2")
Column `county_name2` joining factors with different levels, coercing to character vector
df$paymentTypes <- as.character(df$paymentTypes)
df$paymentTypes[df$paymentTypes==""] <- "NA"
df$paymentTypes <- as.factor(df$paymentTypes)

#make a leaflet map of vege restaurant in NY States


library(leaflet)

library(RColorBrewer)

pal = colorFactor(palette = c("blue", "red"), domain = df$R.D) # Grab a palette
color_vote = pal(df$R.D)

content2 <- paste("County:",data6$county_name2,"<br/>",
                 "Restaurant Name:",data6$name,"<br/>",
                 "Phones:",data6$phones,"<br/>",
                 "PaymentType:",data6$paymentTypes,"<br/>",
                 "PostCode:",data6$postalCode,"<br/>"
                 )


content3 <- paste("County:",df$county_name,"<br/>",
                 "Restaurant Name:",df$name,"<br/>",
                 "Phones:",df$phones,"<br/>",
                 "PaymentType:",df$paymentTypes,"<br/>",
                 "PostCode",df$postalCode,"<br/>"
                 )
                
m2 <- leaflet(data=data6) %>%
   # Base groups
  addTiles(group = "OSM (default)") %>%
  addProviderTiles(providers$Stamen.Toner, group = "Toner") %>%
  addProviderTiles(providers$Stamen.TonerLite, group = "Toner Lite") %>%
   # Overlay groups
  addCircles(
             color="green",
             lng = ~longitude, 
             lat = ~latitude,
             popup = content2,
             group = "Vegetarian Restaurants") %>% 
  addCircleMarkers(data = df, 
             lng = ~longitude, 
             lat = ~latitude,
             popup = content3,
             group = "Political Ideology",
             color= color_vote) %>%
  addLegend(pal = pal, values = ~df$R.D, title = "Won Party in 2016") %>% 
  # Layers control
  addLayersControl(
    baseGroups = c("OSM (default)", "Toner", "Toner Lite"),
    overlayGroups = c("Vegetarian Restaurants", "Political Ideology"),
    options = layersControlOptions(collapsed = FALSE)
  )

m2

NA
LS0tCnRpdGxlOiAibGluemhhb19uZXdfZHZfdmVnZSIKYXV0aG9yOiAiTGluIFpoYW8iCmRhdGU6ICI0LzI1LzIwMjAiCm91dHB1dDogCiBodG1sX25vdGVib29rOgogICAgZGVmYXVsdAogaHRtbF9kb2N1bWVudDoKICAgIGRlZmF1bHQKLS0tCgojaW1wb3J0IHJlc3R1cmFudCBjc3YgdG8gbXkgY29tcHV0ZXIKYGBge3J9CmRhdGExIDwtIHJlYWQuY3N2KCIvVXNlcnMvbGluL0Rlc2t0b3AvUmVzdGF1cmFudC5jc3YiKQpoZWFkKGRhdGExKQpgYGAKCgpgYGB7cn0KY2xhc3MoZGF0YTEkY3Vpc2luZXMpCmBgYAoKYGBge3J9CmEgPC0gYXMuY2hhcmFjdGVyKGRhdGExJGN1aXNpbmVzKSAKYGBgCgojSSBhbSB0cnlpbmcgdG8gaWRlbnRpdHkgd2hpY2ggcmVzdHVyYW50IGlzIHZlZ2V0YXJpYW4gCmBgYHtyfQpsaWJyYXJ5KCJzdHJpbmdyIikKdmVnZSA8LSBzdHJfZGV0ZWN0KGEsIlZlZ2V0YXJpYW4iKQpkYXRhMiA8LSBjYmluZCh2ZWdlLGRhdGExKQpgYGAKCgojRmlsdGVyIG91dCB0aGUgcmVzdGF1cmFudCB3aGljaCBpcyBub3QgdmVnZXRhcmlhbgoKYGBge3J9CmNsYXNzKGRhdGEyJHZlZ2UpCmRhdGEyJHZlZ2UgPC0gYXMubnVtZXJpYyhkYXRhMiR2ZWdlKQpgYGAKCgojZG8gdGhlIHN1YnNldCBmb3IgdmVnZQpgYGB7cn0KbGlicmFyeShkcGx5cikKZGF0YTMgPC0gc3Vic2V0KGRhdGEyLHZlZ2U9PTEpIApgYGAKCgoKIyMgY3JlYXRlIGEgbmV3IGRhdGFzZXQgdGhhdCBJIGNvbnZlcnQgdG8gbGF0IGFuZCBsb24gdG8gdGhlIGNvdW50eSBsZXZlbApgYGB7cn0KbGlicmFyeShkcGx5cikKZGF0YTQgPC0gZGF0YTMgJT4lIAogIHNlbGVjdChpZCxjaXR5LG5hbWUsbGF0aXR1ZGUsIGxvbmdpdHVkZSxwaG9uZXMscGF5bWVudFR5cGVzLHBvc3RhbENvZGUpICU+JSAKICBuYS5vbWl0KCkKVmlldyhkYXRhNCkKYGBgCgoKCmBgYHtyfQpsaWJyYXJ5KHNwKQpsaWJyYXJ5KG1hcHMpCmxpYnJhcnkobWFwdG9vbHMpCgojIFRoZSBzaW5nbGUgYXJndW1lbnQgdG8gdGhpcyBmdW5jdGlvbiwgcG9pbnRzREYsIGlzIGEgZGF0YS5mcmFtZSBpbiB3aGljaDoKIyAgIC0gY29sdW1uIDEgY29udGFpbnMgdGhlIGxvbmdpdHVkZSBpbiBkZWdyZWVzIChuZWdhdGl2ZSBpbiB0aGUgVVMpCiMgICAtIGNvbHVtbiAyIGNvbnRhaW5zIHRoZSBsYXRpdHVkZSBpbiBkZWdyZWVzCgpsYXRsb25nMmNvdW50eSA8LSBmdW5jdGlvbihwb2ludHNERikgewogICAgIyBQcmVwYXJlIFNwYXRpYWxQb2x5Z29ucyBvYmplY3Qgd2l0aCBvbmUgU3BhdGlhbFBvbHlnb24KICAgICMgcGVyIGNvdW50eQogICAgY291bnRpZXMgPC0gbWFwKCdjb3VudHknLCBmaWxsPVRSVUUsIGNvbD0idHJhbnNwYXJlbnQiLCBwbG90PUZBTFNFKQogICAgSURzIDwtIHNhcHBseShzdHJzcGxpdChjb3VudGllcyRuYW1lcywgIjoiKSwgZnVuY3Rpb24oeCkgeFsxXSkKICAgIGNvdW50aWVzX3NwIDwtIG1hcDJTcGF0aWFsUG9seWdvbnMoY291bnRpZXMsIElEcz1JRHMsCiAgICAgICAgICAgICAgICAgICAgIHByb2o0c3RyaW5nPUNSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKCiAgICAjIENvbnZlcnQgcG9pbnRzREYgdG8gYSBTcGF0aWFsUG9pbnRzIG9iamVjdCAKICAgIHBvaW50c1NQIDwtIFNwYXRpYWxQb2ludHMocG9pbnRzREYsIAogICAgICAgICAgICAgICAgICAgIHByb2o0c3RyaW5nPUNSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKCiAgICAjIFVzZSAnb3ZlcicgdG8gZ2V0IF9pbmRpY2VzXyBvZiB0aGUgUG9seWdvbnMgb2JqZWN0IGNvbnRhaW5pbmcgZWFjaCBwb2ludCAKICAgIGluZGljZXMgPC0gb3Zlcihwb2ludHNTUCwgY291bnRpZXNfc3ApCgogICAgIyBSZXR1cm4gdGhlIGNvdW50eSBuYW1lcyBvZiB0aGUgUG9seWdvbnMgb2JqZWN0IGNvbnRhaW5pbmcgZWFjaCBwb2ludAogICAgY291bnR5TmFtZXMgPC0gc2FwcGx5KGNvdW50aWVzX3NwQHBvbHlnb25zLCBmdW5jdGlvbih4KSB4QElEKQogICAgY291bnR5TmFtZXNbaW5kaWNlc10KfQoKIyBUZXN0IHRoZSBmdW5jdGlvbiB1c2luZyBwb2ludHMgaW4gV2lzY29uc2luIGFuZCBPcmVnb24uCnRlc3RQb2ludHMgPC0gZGF0YS5mcmFtZSh4ID0gZGF0YTQkbG9uZ2l0dWRlLCB5ID0gZGF0YTQkbGF0aXR1ZGUpCgpjb3VudHlfbGlzdDwtIGxhdGxvbmcyY291bnR5KHRlc3RQb2ludHMpCmBgYAoKCmBgYHtyfQpjb3VudHlfbGlzdF9kYXRhIDwtIGFzLmRhdGEuZnJhbWUoY291bnR5X2xpc3QpCmRhdGE1IDwtIGNiaW5kKGRhdGE0LGNvdW50eV9saXN0X2RhdGEpICNtZXJnZSB0byBkYXRhNCBieSBhZGRpbmcgYSBjb2x1bW4gbmFtZWQgY291bnR5X2xpc3QKYGBgCgoKCmBgYHtyfQpkYXRhNSA8LSBkYXRhNSAlPiUgCiAgbmEub21pdCgpCnVuaXF1ZShkYXRhNSRjb3VudHlfbGlzdCkKYGBgCgoKI3JlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgbnkgdmVnZSByZXN0YXVyYW50IGRhdGEKYGBge3J9CmNvdW50eV9uYW1lIDwtIGFzLmNoYXJhY3RlcihkYXRhNSRjb3VudHlfbGlzdCkKIyBSZW1vdmUgYWxsIGJlZm9yZSBhbmQgdXAgdG8gIiwiOgpjb3VudHlfbmFtZTIgPC0gZ3N1YigiLiosIiwiIixjb3VudHlfbmFtZSkKZGF0YTYgPC0gY2JpbmQoY291bnR5X25hbWUyLGRhdGE1KSAgCmRhdGE2JGNvdW50eV9saXN0IDwtIE5VTEwKZGF0YTYKYGBgCgoKYGBge3J9CnVuaXF1ZShkYXRhNiRjb3VudHlfbmFtZTIpCmBgYAoKCiNpbXBvcnQgZWxlY3Rpb24gZGF0YSAKYGBge3J9CmVsZWNjb3VudHk8LXJlYWQuY3N2KCIvVXNlcnMvbGluL0Rlc2t0b3AvMjAxNl9VU19Db3VudHlfTGV2ZWxfUHJlc2lkZW50aWFsX1Jlc3VsdHMuY3N2IikKCmVsZWNjb3VudHkkWDEgPC0gTlVMTAoKZWxlY2NvdW50eSA8LSBlbGVjY291bnR5ICU+JSAKICAgICAgICAgZmlsdGVyKHN0YXRlX2FiYnI9PSJOWSIpICN0aGVyZSBhcmUgNjIgY291bnRpZXMgaW4gTlkgU3RhdGUKCmBgYAoKI2RvIHNvbWUgcmVndWxhciBleHByZXNzaW9uIG9uIGVsZWN0aW9uIGRhdGEKCmBgYHtyfQpmb28gPC0gYXMuY2hhcmFjdGVyKGVsZWNjb3VudHkkY291bnR5X25hbWUpCmBgYAoKCmBgYHtyfQpmb28yIDwtIGdzdWIoIlxccypcXHcqJCIsICIiLCBmb28pCmZvbzMgPC0gdG9sb3dlcihmb28yKQpmb280IDwtIHN0cl9yZXBsYWNlKGZvbzMsICJzdC4gbGF3cmVuY2UiLCAic3QgbGF3cmVuY2UiKQpmb280CmBgYAoKI3JlZ3VsYXIgZXhwcmVzc2lvbiBvZiBmaW5hbCBzdGVwIGZvciBlbGVjdGlvbiBkYXRhCmBgYHtyfQpuZXdfZWxlY2NvdW50eSA8LSBjYmluZChlbGVjY291bnR5LGZvbzQpCgpuYW1lcyhuZXdfZWxlY2NvdW50eSlbbmFtZXMobmV3X2VsZWNjb3VudHkpID09ICdmb280J10gPC0gJ2NvdW50eV9uYW1lMicKYGBgCgoKI2NhbGN1bGF0ZSB3aG8gaXMgd2luIGluIDIwMTYgb24gdGhlIGNvdW50eSBsZXZlbApgYGB7cn0KbmV3X2VsZWNjb3VudHkgPC0gbmV3X2VsZWNjb3VudHkgJT4lIAogIG11dGF0ZShkaWZmZXJlbmNlX2luX3ZvdGU9dm90ZXNfZ29wLXZvdGVzX2RlbSkgJT4lIAogIG11dGF0ZSAoUi5EPSBpZmVsc2UoZGlmZmVyZW5jZV9pbl92b3RlID4gMCwgIlJlcHVibGljYW4iLCAiRGVtb2NyYXQiKSkKYGBgIAoKCiNjb21iaW5lIGNsZWFuZWQgbnkgdmVnZSByZWFzdGF1cmFudCB3aXRoIGVsZWN0aW9uIGNvdW50eSBkYXRhIGluIDIwMTYKCmBgYHtyfQojbGVmdCBvdXRlciBqb2luCmRmIDwtIGxlZnRfam9pbihkYXRhNiwgbmV3X2VsZWNjb3VudHksYnkgPSAiY291bnR5X25hbWUyIikKCmRmJHBheW1lbnRUeXBlcyA8LSBhcy5jaGFyYWN0ZXIoZGYkcGF5bWVudFR5cGVzKQpkZiRwYXltZW50VHlwZXNbZGYkcGF5bWVudFR5cGVzPT0iIl0gPC0gIk5BIgpkZiRwYXltZW50VHlwZXMgPC0gYXMuZmFjdG9yKGRmJHBheW1lbnRUeXBlcykKYGBgCgoKCiNtYWtlIGEgbGVhZmxldCBtYXAgb2YgdmVnZSByZXN0YXVyYW50IGluIE5ZIFN0YXRlcwoKCmBgYHtyfQoKbGlicmFyeShsZWFmbGV0KQoKbGlicmFyeShSQ29sb3JCcmV3ZXIpCgpwYWwgPSBjb2xvckZhY3RvcihwYWxldHRlID0gYygiYmx1ZSIsICJyZWQiKSwgZG9tYWluID0gZGYkUi5EKSAjIEdyYWIgYSBwYWxldHRlCmNvbG9yX3ZvdGUgPSBwYWwoZGYkUi5EKQoKY29udGVudDIgPC0gcGFzdGUoIkNvdW50eToiLGRhdGE2JGNvdW50eV9uYW1lMiwiPGJyLz4iLAogICAgICAgICAgICAgICAgICJSZXN0YXVyYW50IE5hbWU6IixkYXRhNiRuYW1lLCI8YnIvPiIsCiAgICAgICAgICAgICAgICAgIlBob25lczoiLGRhdGE2JHBob25lcywiPGJyLz4iLAogICAgICAgICAgICAgICAgICJQYXltZW50VHlwZToiLGRhdGE2JHBheW1lbnRUeXBlcywiPGJyLz4iLAogICAgICAgICAgICAgICAgICJQb3N0Q29kZToiLGRhdGE2JHBvc3RhbENvZGUsIjxici8+IgogICAgICAgICAgICAgICAgICkKCgpjb250ZW50MyA8LSBwYXN0ZSgiQ291bnR5OiIsZGYkY291bnR5X25hbWUsIjxici8+IiwKICAgICAgICAgICAgICAgICAiUmVzdGF1cmFudCBOYW1lOiIsZGYkbmFtZSwiPGJyLz4iLAogICAgICAgICAgICAgICAgICJQaG9uZXM6IixkZiRwaG9uZXMsIjxici8+IiwKICAgICAgICAgICAgICAgICAiUGF5bWVudFR5cGU6IixkZiRwYXltZW50VHlwZXMsIjxici8+IiwKICAgICAgICAgICAgICAgICAiUG9zdENvZGUiLGRmJHBvc3RhbENvZGUsIjxici8+IgogICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAptMiA8LSBsZWFmbGV0KGRhdGE9ZGF0YTYpICU+JQogICAjIEJhc2UgZ3JvdXBzCiAgYWRkVGlsZXMoZ3JvdXAgPSAiT1NNIChkZWZhdWx0KSIpICU+JQogIGFkZFByb3ZpZGVyVGlsZXMocHJvdmlkZXJzJFN0YW1lbi5Ub25lciwgZ3JvdXAgPSAiVG9uZXIiKSAlPiUKICBhZGRQcm92aWRlclRpbGVzKHByb3ZpZGVycyRTdGFtZW4uVG9uZXJMaXRlLCBncm91cCA9ICJUb25lciBMaXRlIikgJT4lCiAgICMgT3ZlcmxheSBncm91cHMKICBhZGRDaXJjbGVzKAogICAgICAgICAgICAgY29sb3I9ImdyZWVuIiwKICAgICAgICAgICAgIGxuZyA9IH5sb25naXR1ZGUsIAogICAgICAgICAgICAgbGF0ID0gfmxhdGl0dWRlLAogICAgICAgICAgICAgcG9wdXAgPSBjb250ZW50MiwKICAgICAgICAgICAgIGdyb3VwID0gIlZlZ2V0YXJpYW4gUmVzdGF1cmFudHMiKSAlPiUgCiAgYWRkQ2lyY2xlTWFya2VycyhkYXRhID0gZGYsIAogICAgICAgICAgICAgbG5nID0gfmxvbmdpdHVkZSwgCiAgICAgICAgICAgICBsYXQgPSB+bGF0aXR1ZGUsCiAgICAgICAgICAgICBwb3B1cCA9IGNvbnRlbnQzLAogICAgICAgICAgICAgZ3JvdXAgPSAiUG9saXRpY2FsIElkZW9sb2d5IiwKICAgICAgICAgICAgIGNvbG9yPSBjb2xvcl92b3RlKSAlPiUKICBhZGRMZWdlbmQocGFsID0gcGFsLCB2YWx1ZXMgPSB+ZGYkUi5ELCB0aXRsZSA9ICJXb24gUGFydHkgaW4gMjAxNiIpICU+JSAKICAjIExheWVycyBjb250cm9sCiAgYWRkTGF5ZXJzQ29udHJvbCgKICAgIGJhc2VHcm91cHMgPSBjKCJPU00gKGRlZmF1bHQpIiwgIlRvbmVyIiwgIlRvbmVyIExpdGUiKSwKICAgIG92ZXJsYXlHcm91cHMgPSBjKCJWZWdldGFyaWFuIFJlc3RhdXJhbnRzIiwgIlBvbGl0aWNhbCBJZGVvbG9neSIpLAogICAgb3B0aW9ucyA9IGxheWVyc0NvbnRyb2xPcHRpb25zKGNvbGxhcHNlZCA9IEZBTFNFKQogICkKCm0yCgpgYGAKCg==